package com.example.cardgame.model2

import java.io.Serializable

// 定义 CardMatchingGame 类，表示卡片匹配游戏
class CardMatchingGame(val count: Int) :Serializable {
    // 游戏得分，私有设置
    var score = 0
        private set//表示该变量的值只能在类内部修改，而在类外部只能读取

    fun setScore(newScore: Int) {
        score = newScore
    }

    // 卡片列表
    val cards: MutableList<Card>
    // 初始化块，创建一副牌并抽取指定数量的卡片
    init {
        val deck = Deck()
        cards = mutableListOf()
        for (i in 1..count) {
            val card: Card? = deck.drawRandomCard()
            if (card != null) {
                cards.add(card)
            }
        }
    }

    // 重置游戏的方法，重新生成牌堆并抽取卡片，分数重置为0
    fun reset(){
        val deck = Deck()
        cards.clear()
        for (i in 1..count) {
            val card: Card? = deck.drawRandomCard()
            if (card != null) {
                cards.add(card)
            }
        }
        score = 0
    }


    // 根据索引获取卡片
    fun cardAtIndex(index: Int): Card {
        return cards.get(index)
    }

    // 常量定义
    val MISMATCH_PENALTY = 2
    val MATCH_BONUS = 8
    val COST_TO_CHOOSE = 1

    // 选择指定索引的卡片
    fun chooseCardAtIndex(index: Int) {
        val card= cardAtIndex(index)
        if (!card.isMatched) {// 如果卡片未匹配
            if (card.isChosen) {// 如果卡片已选择
                card.isChosen = false// 取消选择
            } else {// 如果卡片未选择
                val chosenCards = cards.filter { it.isChosen && !it.isMatched }
                if (chosenCards.size == 2) {// 如果已经选择了两张卡片
                    val matchScore = card.match(chosenCards.toTypedArray())// 匹配卡片
                    // 根据匹配结果调整得分
                    if (matchScore > 0) {// 如果匹配成功
                        score += matchScore * MATCH_BONUS// 增加得分
                        chosenCards.forEach { it.isMatched = true }// 标记为已匹配
                        card.isMatched = true// 标记为已匹配
                    } else {// 如果匹配失败
                        score -= MISMATCH_PENALTY// 减少得分
                        chosenCards.forEach { it.isChosen = false }// 取消选择
                    }
                }
                score -= COST_TO_CHOOSE // 每次选择卡片都会扣分
                card.isChosen = true    // 标记为已选择
            }
        }
    }
}